// 声明函数的两种方式：函数声明和函数表达式
// 一个函数有输入和输出，要在TypeScript中对其进行约束，需要把输入和输出都考虑到，其中函数声明的类型定义较简单：
function sum(x: number, y: number): number {
    return x + y;
}

// 注意：如果输入多余的参数，是不被允许的
function sum2(x: number, y: number): number {
    return x + y;
}
// sum2(1, 2, 3);// index.ts(4,1): error TS2346: Supplied parameters do not match any signature of call target.

// 函数表达式

let mySum: (x: number, y: number) => number = function(x: number, y: number): number {
    return x + y;
}
// 在TypeScript的类型定义中，=> 用来表示函数的定义，左边是输入类型，需要用括号括起来，右边是输出类型。

// 接口中函数的定义
interface SearchFunc {
    (source: string, subString: string): boolean;
}
let mySearch: SearchFunc;
mySearch = function(source: string, subString: string) {
    return source.search(subString) !== -1;
}
// 可选参数：
// 注意：可选参数后面不允许再出现必须参数了

// 剩余参数
function push(array, ...items){
  items.forEach(function(item){
    array.push(item);
  });
}
let a = [];
push(a, 1, 2, 3);


// typeScipt学习地址：
// https://ts.xcatliu.com/basics/type-of-function.html

// 重载：是允许一个函数接受不同数量或类型的参数，做出不同的处理。
function reverse(x: number):number;
function reverse(x: string):string;
function reverse(x: number | string):number | string {
  if(typeof x === 'number') {
    return Number(x.toString().split('').reverse().join(''));
  }else if(typeof x === 'string'){
    return x.split('').reverse().join('');
  }
}
